'use strict';

/*函数的定义和调用练习
定义一个计算圆面积的函数area_of_circle()，它有两个参数：
r: 表示圆的半径；
pi: 表示π的值，如果不传，则默认3.14
*/
function area_of_circle(r, pi) {
    let p = pi || 3.14;
    console.log(`圆的面积为：${p * r * r}`);
}
area_of_circle(2);

//小明是一个JavaScript新手，他写了一个max()函数，返回两个数中较大的那个：
function max(a, b) {
    if (a > b) {
        return a;
    }
    if (b > a) {
        return b;
    }
    else {
        return 0;
    }
}
console.log(max(10, 10));

/*高阶函数练习：利用reduce()求积：
*/
let arr = [2, 4, 8, 1, 6];
console.log(arr);
let res = arr.reduce((x, y) => x * y)
console.log(res);

//练习：不要使用JavaScript内置的parseInt()函数，利用map和reduce操作实现一个string2int()函数：
function string2int(s) {
    let re = s.split('');  //split函数作用于把传进来的字符串变成字符数组
    console.log(re);
    let res = re.map(Number).reduce((x, y) => x * 10 + y); //用map方法把字符串数组转换成number型再用reduce方法箭头函数把number数组转换成int型整数
    console.log(res);
}
let _2int = '59278'; //定义字符串59278
string2int(_2int); //调用函数传入参数_2int

//请把用户输入的不规范的英文名字，变为首字母大写，其他小写的规范名字。输入：['adam', 'LISA', 'barT']，输出：['Adam', 'Lisa', 'Bart']。
function normalize(arr) {
    function correct(word) {
        var list = '';
        for (let i = 0; i < word.length; i++) {
            if (i === 0)
                list += word[i].toUpperCase();
            else
                list += word[i].toLowerCase();
        }

        return list;
    }

    return arr.map(correct);

}
console.log((normalize(['admin', 'LISA', 'barT'])));

//小明希望利用map()把字符串变成整数，他写的代码很简洁：
let ar = ['1', '2', '3'];
let r = ar.map(function fn(date) {
    return +date
})
console.log(r);

//请尝试用filter()筛选出素数： ❌
// function get_primes(arrary) {
//     let result = arrary.filter(function fi(x) {
//         if (x === 1 && x === 0) {
//             return false;
//         }
//         for (var i = 2; i < x; i++)
//             if (x % i === 0) {
//                 return false;
//             }
//             else {
//                 return true;
//             }
//     })
// };
// var arrary = [1, 2, 3, 4, 5];
// console.log(get_primes(array));

//要生成一个自增的ID，可以编写一个next_id()函数：
function* next_id() {  //用generator生成器来定义
    let id = 0;  //定义一个变量id
    while (true) { //为什么这里用while
        id++;  //id++，逐步自增
        yield id;  //多次返回id
    }
}
let aum = next_id();  //定义一个变量让他等于next_id这个函数
for (var i = 0; i <= 10; i++) {  //for循环
    console.log(aum.next().value); //这句没太理解 1 2 3 4 5 6 7 8 9 10 11
}
var
    x,
    pass = true,
    g = next_id();
for (x = 1; x < 100; x++) {
    if (g.next().value !== x) {
        pass = false;
        console.log('测试失败!');
        break;
    }
}
if (pass) {
    console.log('测试通过!');
}


//小明为了和女友庆祝情人节，特意制作了网页，并提前预定了法式餐厅。小明打算用JavaScript给女友一个惊喜留言：
var today = new Date();
if (today.getMonth() === 1 && today.getDate() === 14) { //因为月份从0开始，类似索引下标，所以2月的下标应该是1
    alert('亲爱的，我预定了晚餐，晚上6点在餐厅见！');
}
Date();  //调用函数

//请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email：
function check(email_address) {
    var regex = /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g;
    if (regex.test(email_address)) {
        var user_name = email_address.replace(regex, "$1");
        var domain_name = email_address.replace(regex, "$2");
        var alert_string = "您输入的电子邮件地址合法\n\n";
        alert_string += "用户名：" + user_name + "\n";
        alert_string += "域名：" + domain_name;
        window.alert(alert_string);
        return true;
    }
    else {
        window.alert("您输入的电子邮件地址不合法");
        return false;
    }
}
check('3147332144@qq.com');
// 版本二：可以验证并提取出带名字的Email地址：❌

//用浏览器访问OpenWeatherMap的天气API，查看返回的JSON数据，然后返回城市、天气预报等信息：


//请利用构造函数定义Cat，并让所有的Cat对象有一个name属性，并共享一个方法say()，返回字符串'Hello, xxx!'：❌
// function cat(name) {
//     this.name = name;
//     this.hi = function say(name) {
//         return `Hello,${name}!`
//     }
// }
// let zengting = new cat('曾婷');
// console.log(hi(zengting));

//class继承练习：请利用class重新定义Cat，并让它从已有的Animal继承，然后新增一个方法say()，返回字符串'Hello, xxx!'：❌
class Animal {
    constructor(name) {
        this.name = name;
    }
}
class Cat extends Animal {
    constructor(name) {
        super(name); //super关键字调用父类构造方法
    }
    say(){
        return `Hello,${this.name}！`
    }
}
var kitty = new Cat('Kitty');
var doraemon = new Cat('哆啦A梦');
if ((new Cat('x') instanceof Animal)
    && kitty 
    && kitty.name === 'Kitty'
    && kitty.say
    && typeof kitty.say === 'function'
    && kitty.say() === 'Hello, Kitty!'
    && kitty.say === doraemon.say)
{
    console.log('测试通过!');
} else {
    console.log('测试失败!');
}                 

var menu = document.getElementById('drink-menu');
var drinks = document.getElementsByTagName('dt');
var i, s;

s = '提供的饮料有:';
for (i=0; i<drinks.length; i++) {
    s = s + drinks[i].innerHTML + ',';
}
console.log(s);

/*练习
有如下的HTML结构：
javascript

Java

<!-- HTML结构 -->
<div id="test-div">
  <p id="test-js">javascript</p>
  <p>Java</p>
</div>
请尝试获取指定节点并修改*/
// 获取<p>javascript</p>节点
let js = document.getElementById("tesst-div"); 
console.log(js.innerHTML);



